#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
基础选项卡 - 提供所有选项卡共有的基础功能
"""

import os
import threading
import tkinter as tk
from tkinter import ttk, filedialog, messagebox
from pathlib import Path


class BaseTab(ttk.Frame):
    """基础选项卡类，提供通用功能"""
    
    def __init__(self, parent):
        super().__init__(parent)
        
        # 状态变量
        self.is_processing = False
        
    def browse_directory(self, title="选择目录", var=None):
        """通用的目录选择对话框
        
        Args:
            title: 对话框标题
            var: 存储选择结果的StringVar变量
        
        Returns:
            str: 选择的目录路径，如果取消则返回None
        """
        directory = filedialog.askdirectory(title=title)
        
        if directory and var:
            var.set(directory)
            
        return directory if directory else None
    
    def browse_file(self, title="选择文件", filetypes=None, var=None):
        """通用的文件选择对话框
        
        Args:
            title: 对话框标题
            filetypes: 文件类型过滤器，如[("所有文件", "*.*")]
            var: 存储选择结果的StringVar变量
        
        Returns:
            str: 选择的文件路径，如果取消则返回None
        """
        if not filetypes:
            filetypes = [("所有文件", "*.*")]
            
        file_path = filedialog.askopenfilename(title=title, filetypes=filetypes)
        
        if file_path and var:
            var.set(file_path)
            
        return file_path if file_path else None
    
    def show_progress(self, text, text_var):
        """显示进度信息
        
        Args:
            text: 要显示的进度文本
            text_var: 显示文本的StringVar变量
        """
        text_var.set(text)
        self.update_idletasks()
    
    def run_in_thread(self, func, args=(), kwargs=None, on_complete=None):
        """在线程中运行函数
        
        Args:
            func: 要运行的函数
            args: 函数参数
            kwargs: 函数关键字参数
            on_complete: 完成后的回调函数
        """
        if kwargs is None:
            kwargs = {}
            
        def thread_func():
            try:
                self.is_processing = True
                result = func(*args, **kwargs)
                
                if on_complete:
                    # 在主线程中执行回调
                    self.after(0, lambda: on_complete(result))
            except Exception as e:
                # 在主线程中显示错误消息
                self.after(0, lambda: messagebox.showerror("错误", str(e)))
            finally:
                self.is_processing = False
        
        thread = threading.Thread(target=thread_func)
        thread.daemon = True  # 使线程随主线程结束而结束
        thread.start()
        
        return thread
    
    def validate_directory(self, directory, create_if_missing=False):
        """验证目录是否存在且有效
        
        Args:
            directory: 要验证的目录路径
            create_if_missing: 如果目录不存在是否创建
            
        Returns:
            bool: 目录是否有效
        """
        if not directory:
            messagebox.showerror("错误", "请选择目录")
            return False
        
        path = Path(directory)
        
        if path.exists() and path.is_dir():
            return True
        
        if path.exists() and not path.is_dir():
            messagebox.showerror("错误", f"路径存在但不是目录: {directory}")
            return False
        
        if create_if_missing:
            try:
                path.mkdir(parents=True, exist_ok=True)
                return True
            except Exception as e:
                messagebox.showerror("错误", f"创建目录失败: {e}")
                return False
        else:
            messagebox.showerror("错误", f"目录不存在: {directory}")
            return False
    
    def create_text_display(self, parent, height=10):
        """创建文本显示区域
        
        Args:
            parent: 父容器
            height: 文本区域高度
            
        Returns:
            tk.Text: 文本显示控件
        """
        text_widget = tk.Text(parent, wrap=tk.WORD, height=height)
        text_widget.pack(fill=tk.BOTH, expand=True, padx=5, pady=5)
        
        scrollbar = ttk.Scrollbar(text_widget, command=text_widget.yview)
        scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
        text_widget.config(yscrollcommand=scrollbar.set)
        text_widget.config(state=tk.DISABLED)
        
        return text_widget 